package com.hutao.manage.util;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;

import org.im4java.core.CompositeCmd;
import org.im4java.core.ConvertCmd;
import org.im4java.core.IM4JavaException;
import org.im4java.core.IMOperation;
import org.im4java.core.IdentifyCmd;
import org.im4java.process.ArrayListOutputConsumer;
import org.im4java.process.StandardStream;

public class GraphicsMagicUtil {
	/**
	 * 获得图片文件大小[小技巧来获得图片大小]
	 *
	 * @param filePath
	 *            文件路径
	 * @return 文件大小
	 */
	public static int getSize(String imagePath) {
		int size = 0;
		FileInputStream inputStream = null;
		try {
			inputStream = new FileInputStream(imagePath);
			size = inputStream.available();
			inputStream.close();
			inputStream = null;
		} catch (FileNotFoundException e) {
			size = 0;
			System.out.println("文件未找到!");
		} catch (IOException e) {
			size = 0;
			System.out.println("读取文件大小错误!");
		} finally {
			// 可能异常为关闭输入流,所以需要关闭输入流
			if (null != inputStream) {
				try {
					inputStream.close();
				} catch (IOException e) {
					System.out.println("关闭文件读入流异常");
				}
				inputStream = null;
			}
		}
		return size;
	}

	/**
	 * 获得图片的宽度
	 *
	 * @param filePath
	 *            文件路径
	 * @return 图片宽度
	 */
	public static int getWidth(String imagePath) {
		int line = 0;
		try {
			IMOperation op = new IMOperation();
			op.format("%w"); // 设置获取宽度参数
			op.addImage(1);
			IdentifyCmd identifyCmd = new IdentifyCmd(true);
			ArrayListOutputConsumer output = new ArrayListOutputConsumer();
			identifyCmd.setOutputConsumer(output);
			identifyCmd.run(op, imagePath);
			ArrayList<String> cmdOutput = output.getOutput();
			assert cmdOutput.size() == 1;
			line = Integer.parseInt(cmdOutput.get(0));
		} catch (Exception e) {
			line = 0;
			System.out.println("运行指令出错!");
		}
		return line;
	}

	/**
	 * 获得图片的高度
	 *
	 * @param imagePath
	 *            文件路径
	 * @return 图片高度
	 */
	public static int getHeight(String imagePath) {
		int line = 0;
		try {
			IMOperation op = new IMOperation();
			op.format("%h"); // 设置获取高度参数
			op.addImage(1);
			IdentifyCmd identifyCmd = new IdentifyCmd(true);
			ArrayListOutputConsumer output = new ArrayListOutputConsumer();
			identifyCmd.setOutputConsumer(output);
			identifyCmd.run(op, imagePath);
			ArrayList<String> cmdOutput = output.getOutput();
			assert cmdOutput.size() == 1;
			line = Integer.parseInt(cmdOutput.get(0));
		} catch (Exception e) {
			line = 0;
			System.out.println("运行指令出错!" + e.toString());
		}
		return line;
	}

	/**
	 * 图片添加水印
	 * 
	 * @param picPath
	 *            图片路径
	 * @param drawPicPath
	 *            draw后的路径
	 * @param width
	 *            draw后的宽度
	 * @param height
	 *            draw后的高度
	 * @throws IOException
	 * @throws InterruptedException
	 * @throws IM4JavaException
	 */
	public static void drawImg(String picPath, String drawPicPath, int width, int height)
			throws IOException, InterruptedException, IM4JavaException {
		IMOperation op = new IMOperation();
		op.addImage();
		// op.rotate(45d);
		op.resize(width, height);
		op.font("Arial").fill("red").draw("text 100,100 www.taobao.com");
		op.quality(85d);
		op.addImage();
		// IM4JAVA是同时支持ImageMagick和GraphicsMagick的，如果为true则使用GM，如果为false支持IM。
		ConvertCmd cmd = new ConvertCmd(true);
		String osName = System.getProperty("os.name").toLowerCase();
		// linux下不要设置此值，不然会报错
		if (osName.indexOf("win") >= 0) {
			cmd.setSearchPath("C:\\\\Program Files\\\\GraphicsMagick-1.3.34-Q16");
		}
		cmd.setErrorConsumer(StandardStream.STDERR);
		cmd.run(op, picPath, drawPicPath);
	}

	/**
	 * 图片信息
	 *
	 * @param imagePath
	 * @return
	 */
	public static String getImageInfo(String imagePath) {
		String line = null;
		try {
			IMOperation op = new IMOperation();
			op.format("width:%w,height:%h,path:%d%f,size:%b%[EXIF:DateTimeOriginal]");
			op.addImage(1);
			IdentifyCmd identifyCmd = new IdentifyCmd(true);
			ArrayListOutputConsumer output = new ArrayListOutputConsumer();
			identifyCmd.setOutputConsumer(output);
			identifyCmd.run(op, imagePath);
			ArrayList<String> cmdOutput = output.getOutput();
			assert cmdOutput.size() == 1;
			line = cmdOutput.get(0);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return line;
	}

	/**
	 * 裁剪图片
	 *
	 * @param imagePath
	 *            源图片路径
	 * @param newPath
	 *            处理后图片路径
	 * @param x
	 *            起始X坐标
	 * @param y
	 *            起始Y坐标
	 * @param width
	 *            裁剪宽度
	 * @param height
	 *            裁剪高度
	 * @return 返回true说明裁剪成功,否则失败
	 */
	public static boolean cutImage(String imagePath, String newPath, int x, int y, int width, int height) {
		boolean flag = false;
		try {
			IMOperation op = new IMOperation();
			op.addImage(imagePath);
			/** width：裁剪的宽度 * height：裁剪的高度 * x：裁剪的横坐标 * y：裁剪纵坐标 */
			op.crop(width, height, x, y);
			op.addImage(newPath);
			ConvertCmd convert = new ConvertCmd(true);
			convert.run(op);
			flag = true;
		} catch (IOException e) {
			System.out.println("文件读取错误!");
			flag = false;
		} catch (InterruptedException e) {
			flag = false;
		} catch (IM4JavaException e) {
			flag = false;
		}
		return flag;
	}

	/**
	 * 根据尺寸缩放图片[等比例缩放:参数height为null,按宽度缩放比例缩放;参数width为null,按高度缩放比例缩放]
	 *
	 * @param imagePath
	 *            源图片路径
	 * @param newPath
	 *            处理后图片路径
	 * @param width
	 *            缩放后的图片宽度
	 * @param height
	 *            缩放后的图片高度
	 * @return 返回true说明缩放成功,否则失败
	 */
	public static boolean zoomImage(String imagePath, String newPath, Integer width, Integer height) {
		boolean flag = false;
		try {
			IMOperation op = new IMOperation();
			op.addImage(imagePath);
			if (width == null) {// 根据高度缩放图片
				op.resize(null, height);
			} else if (height == null) {// 根据宽度缩放图片
				op.resize(width);
			} else {
				op.resize(width, height);
			}
			op.addImage(newPath);
			ConvertCmd convert = new ConvertCmd(true);
			convert.run(op);
			flag = true;
		} catch (IOException e) {
			e.printStackTrace();
			System.out.println("文件读取错误!");
			flag = false;
		} catch (InterruptedException e) {
			flag = false;
		} catch (IM4JavaException e) {
			flag = false;
		}
		return flag;
	}

	/**
	 * t图片去污
	 * 
	 * @throws IM4JavaException
	 * @throws InterruptedException
	 * @throws IOException
	 */
	public static boolean decontaminationImg(String imagePath, String newPath) {
		boolean flag = false;
		try {

			IMOperation op = new IMOperation();
			op.addImage(imagePath);
			op.addRawArgs("-fill", "white");
			op.addRawArgs("-gravity", "center");
			op.addImage(newPath);
			ConvertCmd cmd = new ConvertCmd(true);
			cmd.run(op);
			flag = true;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return flag;
	}

	/**
	 * 图片旋转
	 * 
	 * @param imagePath
	 *            源图片路径
	 * @param newPath
	 *            处理后图片路径
	 * @param degree
	 *            旋转角度
	 * @throws IM4JavaException
	 * @throws InterruptedException
	 * @throws IOException
	 */
	public static void rotate(String imagePath, String newPath, double degree)
			throws IOException, InterruptedException, IM4JavaException {

		// 1.将角度转换到0-360度之间
		degree = degree % 360;
		if (degree <= 0) {
			degree = 360 + degree;
		}
		
		IMOperation op = new IMOperation();
		op.addImage(imagePath);
		op.rotate(degree);
		op.addImage(newPath);
		ConvertCmd cmd = new ConvertCmd(true);
		cmd.setSearchPath("C:\\\\Program Files\\\\GraphicsMagick-1.3.34-Q16");
		cmd.run(op);

	}

	/**
	 * 添加图片水印
	 * 
	 * @param srcPath
	 *            原图片路径
	 * @param distPath
	 *            新图片路径
	 * @param watermarkImg
	 *            水印图片路径
	 * @param width
	 *            水印宽度（可以于水印图片大小不同）
	 * @param height
	 *            水印高度（可以于水印图片大小不同）
	 * @param x
	 *            水印开始X坐标
	 * @param y
	 *            水印开始Y坐标
	 * @param alpha
	 *            透明度[0-100]
	 * @throws IOException
	 * @throws InterruptedException
	 * @throws IM4JavaException
	 */
	@SuppressWarnings("unused")
	private static void addWatermarkToImg(String srcPath, String distPath, String watermarkImg, int width, int height,
			int x, int y, int alpha) throws IOException, InterruptedException, IM4JavaException {
		CompositeCmd cmd = new CompositeCmd(true);
		cmd.setSearchPath("C:\\\\Program Files\\\\GraphicsMagick-1.3.34-Q16");
		IMOperation op = new IMOperation();
		op.dissolve(alpha);
		op.geometry(width, height, x, y);
		op.addImage(watermarkImg, srcPath, distPath);
		cmd.run(op);
	}

	/**
	 * 转换格式格式
	 *
	 * @param srcPath
	 *            原图片路径
	 * @param desPath
	 *            目标图片路径
	 * @return
	 */
	public static boolean picTransform(String srcPath, String desPath) {
		boolean flag = true;
		try {
			IMOperation operation = new IMOperation();
			operation.addImage(srcPath);
			operation.addImage(desPath);
			// IM4JAVA是同时支持ImageMagick和GraphicsMagick的，如果为true则使用GM，如果为false支持IM。
			ConvertCmd cmd = new ConvertCmd(true);
			// 可以省略在windows下默认配置path
			String osName = System.getProperty("os.name").toLowerCase();
			// linux下不要设置此值，不然会报错
			if (osName.indexOf("win") >= 0) {
				cmd.setSearchPath("C:\\Program Files\\GraphicsMagick-1.3.34-Q16");
			}
			cmd.run(operation);
		} catch (Exception e) {
			flag = false;
		}
		return flag;
	}

	// /**
	// * 图片转pdf
	// *
	// * @param srcPath
	// * 原图片路径
	// * @param desPath
	// * 目标图片路径
	// * @return
	// */
	// public static boolean picTransformPDF(String []srcPath, String desPath) {
	// boolean flag = true;
	// try {
	// IMOperation operation = new IMOperation();
	// operation.addImage(srcPath);
	// operation.addImage(desPath);
	// // IM4JAVA是同时支持ImageMagick和GraphicsMagick的，如果为true则使用GM，如果为false支持IM。
	// ConvertCmd cmd = new ConvertCmd(true);
	// //可以省略在windows下默认配置path
	// String osName = System.getProperty("os.name").toLowerCase();
	// // linux下不要设置此值，不然会报错
	// if (osName.indexOf("win") >= 0) {
	// cmd.setSearchPath("C://Program Files//GraphicsMagick-1.3.18-Q8");
	// }
	// cmd.run(operation);
	// } catch (Exception e) {
	// flag = false;
	// }
	// return flag;
	// }

	/**
	 * 图片转pdf
	 *
	 * @param srcPath
	 *            原图片路径
	 * @param desPath
	 *            目标图片路径
	 * @return
	 */
	public static boolean picTransformPDF(String[] srcPath, String desPath) {
		boolean flag = true;
		try {
			IMOperation operation = new IMOperation();
			operation.addImage(srcPath);
			operation.addImage(desPath);
			// IM4JAVA是同时支持ImageMagick和GraphicsMagick的，如果为true则使用GM，如果为false支持IM。
			ConvertCmd cmd = new ConvertCmd(true);
			// 可以省略在windows下默认配置path
			String osName = System.getProperty("os.name").toLowerCase();
			// linux下不要设置此值，不然会报错
			if (osName.indexOf("win") >= 0) {
				cmd.setSearchPath("C:\\Program Files\\GraphicsMagick-1.3.34-Q16");
			}
			cmd.run(operation);
		} catch (Exception e) {
			flag = false;
		}
		return flag;
	}
	
	
	public static void main(String[] args) throws IOException, InterruptedException, IM4JavaException {
/*		String [] arr = {"D:/publics/upload/medex/11111111111/11834639_1.jpg","D:/publics/upload/medex/11111111111/11834639_1.jpg"};
		picTransformPDF(arr,"D://1234567.pdf");*/
		//rotate("D://1.jpg","D://2.jpg",90);
		System.out.println("开始");
		getImageInfo("D://1.jpg");
		//picTransform("D:\\publics\\upload\\singnature\\ultrasonic\\祝艳秋.bmp","D:\\publics\\upload\\singnature\\ultrasonic\\祝艳秋.png");
	}

	// public static void main(String args[]) throws IOException,
	// InterruptedException, IM4JavaException {
	// try {
	// drawImg("D://01.jpg", "D://02.jpg", 300, 400);
	// } catch (Exception e) {
	// e.printStackTrace();
	// }
	// 获取图片大小
	// System.out.println(getSize("D://01.jpg"));
	// 获取图片宽度
	// System.out.println(getWidth("D://04.jpg"));
	// 获取图片高度
	// System.out.println(getHeight("D://04.jpg"));
	// 图片信息
	// width:688,height:395,path:D:/01.jpg,size:232.3Kiunknown
	// System.out.println(getImageInfo("D://01.jpg"));
	// 图片裁剪
	// System.out.println(cutImage("D://04.jpg", "D://03.jpg", 0, 0, 400,
	// 400));
	// System.out.println(zoomImage("D://01.jpg", "D://04.jpg",200, 200));
	// 图片旋转
	// System.out.println(rotate("D://01.jpg", "D://04.jpg",180));

	// decontaminationImg("D://04.jpg", "D://05.jpg");
	// int width= getWidth("D://1.png");
	// int height=getHeight("D://1.png");
	// int startX=(width-500)/2;
	// int startY=(height-500)/2;
	// addWatermarkToImg("D://1.png", "D://3.jpg", "D://2.jpg", 500, 500,
	// startX, startY, 20);

	// picTransform("D:/MRLOCAL/00000001.tif","D:/MRLOCAL/2.jpg");
	// }
}
